home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / CW GUSI 1.6.4 / Examples / GUSIUnixTest.c < prev    next >
C/C++ Source or Header  |  1995-04-17  |  4KB  |  162 lines

  1. /*********************************************************************
  2. File        :    GUSI                -    Grand Unified Socket Interface
  3. File        :    GUSIUnixTest    -    Test unix domain sockets
  4. Author    :    Matthias Neeracher <neeri@iis.ethz.ch>
  5. Language    :    MPW C
  6.  
  7. $Log: GUSIUnixTest.c,v $
  8. Revision 1.1  1994/02/25  02:48:37  neeri
  9. Initial revision
  10.  
  11. Revision 0.4  1992/09/08  00:00:00  neeri
  12. Factor out more common code
  13.  
  14. Revision 0.3  1992/07/26  00:00:00  neeri
  15. Fixed a few minor bugs
  16.  
  17. Revision 0.2  1992/07/25  00:00:00  neeri
  18. Adapt to new testing gear & implementation
  19.  
  20. Revision 0.1  1992/04/17  00:00:00  neeri
  21. Handle SIOW activate/update
  22.  
  23. *********************************************************************/
  24.  
  25. #include <GUSI.h>
  26. #include "GUSITest.h"
  27. #include <stdio.h>
  28. #include <fcntl.h>
  29. #include <stdlib.h>
  30. #include <errno.h>
  31. #include <string.h>
  32.  
  33. #include "Events.h"
  34.  
  35. extern int GUSIDefaultSpin(spin_msg, long);
  36.  
  37. void Socket(char ch1, char ch2, const char * cmd)
  38. {
  39.     sock    =    socket(AF_UNIX, (ch1 == 's') ? SOCK_STREAM : SOCK_DGRAM, 0);
  40.     
  41.     if (sock == -1)    {
  42.         printf("# socket() returned error %s\n", Explain());
  43.         Where();
  44.     }
  45. }
  46.  
  47. void Bind(char ch1, char ch2, const char * cmd)
  48. {
  49.     int                        len;
  50.     struct sockaddr_un    addr;
  51.  
  52.     if (sock == -1)    {
  53.         printf("# socket is not open\n");
  54.         Where();
  55.         
  56.         return;
  57.     }
  58.  
  59.     if (sscanf(cmd, "%s", addr.sun_path) == 1) {
  60.         addr.sun_family    =    AF_UNIX;
  61.         len                    =    strlen(addr.sun_path)+2;
  62.     } else {
  63.         len = sizeof(struct sockaddr_un);
  64.         
  65.         if (choose(AF_UNIX, 0, "", nil, CHOOSE_NEW, &addr, &len))    {
  66.             printf("# choose() returned error %s\n", Explain());
  67.             Where();
  68.             
  69.             return;
  70.         }
  71.     }
  72.  
  73.     if (bind(sock, (struct sockaddr *) &addr, len))    {
  74.         printf("bind(\"%s\") returned error %s\n", addr.sun_path, Explain());
  75.         Where();
  76.     }
  77. }
  78.  
  79. void Accept(char ch1, char ch2, const char * cmd)
  80. {
  81.     int                        len;
  82.     struct sockaddr_un    addr;
  83.  
  84.     if (sock == -1)    {
  85.         printf("# socket is not open\n");
  86.         Where();
  87.         
  88.         return;
  89.     }
  90.     if (accsock != -1)    {
  91.         printf("# can't accept more than one connection\n");
  92.         Where();
  93.         
  94.         return;
  95.     }
  96.  
  97.     len    =    sizeof(struct sockaddr_un);
  98.     sock    =    accept(accsock = sock, (struct sockaddr *) &addr, &len);
  99.     
  100.     if (sock < 0)    {
  101.         printf("# accept() returned error %s\n", Explain());
  102.         sock        =    accsock;
  103.         accsock    =    -1;
  104.     } else {
  105.         addr.sun_path[len-2]    = 0;
  106.         
  107.         printf("# accepted connection from \"%s\"\n", addr.sun_path);
  108.     }
  109.     
  110.     Where();
  111. }
  112.     
  113. void Connect(char ch1, char ch2, const char * cmd)
  114. {
  115.     int                        len;
  116.     struct sockaddr_un    addr;
  117.  
  118.     if (sock == -1)    {
  119.         printf("# socket is not open\n");
  120.         Where();
  121.         
  122.         return;
  123.     }
  124.     
  125.     if (sscanf(cmd, "%s", addr.sun_path) == 1) {
  126.         addr.sun_family    =    AF_UNIX;
  127.         len                    =    strlen(addr.sun_path)+2;
  128.     } else {
  129.         len = sizeof(struct sockaddr_un);
  130.         
  131.         if (choose(AF_UNIX, 0, "", nil, 0, &addr, &len))    {
  132.             printf("# choose() returned error %s\n", Explain());
  133.             Where();
  134.             
  135.             return;
  136.         }
  137.     }
  138.  
  139.     if (connect(sock, (struct sockaddr *) &addr, len))    {
  140.         printf("connect(\"%s\") returned error %s\n", addr.sun_path, Explain());
  141.         Where();
  142.     }
  143. }    
  144.  
  145. main(int argc, char ** argv)
  146. {
  147.     GUSISetup(GUSIwithSIOUXSockets);
  148.     GUSISetup(GUSIwithUnixSockets);
  149.     
  150.     printf("GUSIUnixTest        MN 16Apr95\n\n");
  151.  
  152.     COMMAND('s', 's', Socket,  "",                 "Create a stream socket");
  153.     COMMAND('d', 's', Socket,  "",                 "Create a datagram socket");
  154.     COMMAND('b', 'd', Bind,      "[filename]",     "Bind to address");
  155.     COMMAND('c', 'o', Connect, "[filename]",     "Connect to address");
  156.     COMMAND('a', 'c', Accept,  "",                 "Accept a connection");
  157.     
  158.     AddSocketCommands();
  159.     
  160.     RunTest(argc, argv);
  161.     CleanupSockets();
  162. }